﻿#define  _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
// main函数的多种写法

// 1 古老的写法
//void main()
//{
//	printf("hehe\n");
//}

// 2.参数部分多了void，这里的void表示main函数无参数
//int main(void)
//{
//	return 0;
//}

// 3  其实main函数可以有参数，他的参数是有特殊意义的，如果你想使用main函数的参数就写上
// 如果不想使用就不写  目前不需要了解main函数的参数
//int main(int argc, char* argv[])
//{
//	return 0;
//}

// printf是函数  c语言的标准库中提供的现成的函数
// 功能：在屏幕上打印信息
// print f   format  -按照格式来打印信息
// ""括起来的一串字符被称:字符串 \n是换行符

// %d - 打印整数   %c - 打印字符
// %f - 打印单精度浮点数  %lf - 打印双精度浮点数
// %s - 打印字符串  以上这些都是占位符
// 使用printf 需要头文件 #include <stdio.h> std - standard - 标准  i - input - 输入
// o - output - 输出6

//int main()
//{
//	printf("%d\n",100);
//	printf("%s\n", "ssss");
//	printf("%c\n", 'q');  // 单引号括起来的叫字符
//	printf("%f\n", 3.15);  // %f默认小数点后打印6位
//	printf("%lf\n", 3.15);
//	return 0;
//}

//int main()
//{
//	printf("hehe\n");
//	return 0;
//}

// 字符A~Z的ASCII码值从65~90
// 字符a~z的ASCII码值从97~122
// 对应的⼤⼩写字符(a和A)的ASCII码值的差值是32
// 数字字符0~9的ASCII码值从48~57
// 换⾏ \n 的ASCII值是：10
// 在这些字符中ASCII码值从0~31 这32个字符是不可打印字符，⽆法打印在屏幕上观察


//int main()
//{
//	//32-127  可以打印ASCII表对应的字符
//	int i = 0;
//	for (i = 32; i <= 127; i++)
//	{
//		printf("%c ", i);
//	}
//	return 0;
//}

//C语⾔字符串中⼀个特殊的知识，就是在字符串的末尾隐藏放着⼀个 \0 字符，这个 \0 字符是字符串
//的结束标志。

//对于字符串"abcdef"，我们实际上看到了6个字符：a, b, c, d, e, f，但是实际上在末尾还隐藏⼀个 \0 的
//转义字符， \0 是字符串的结束标志。所以我们在使⽤库函数 printf() 打印字符串或者
//strlen() 计算字符串⻓度的时候，遇到 \0 的时候就⾃动停⽌了。

// 字符串可以存放到字符数组
//int main()
//{
//	char arr1[] = "abcdef";  // arr1中有\0
//	char arr2[] = { 'a','b','c','d','e','f' };  //arr2中没有\0
//	printf("%s\n", arr1); //abcdef
//	printf("%s\n", arr2); // abcdef烫烫烫乱码
//
//
//
//	return 0;
//}

//int main()
//{
//	char arr1[] = "abcdef";  // arr1中有\0
//	char arr2[] = { 'a','b','c','d','e','f','\0'};  //arr2中有\0
//	printf("%s\n", arr1); //abcdef
//	printf("%s\n", arr2); // abcdef  这样就可以体现\0的作用了
//
//
//
//	return 0;
//}


// strlen是一个函数 - 求字符串的长度，统计的是字符串中\0之前的
#include <string.h>
//int main()
//{
//	char arr1[] = "abcdef";  // arr1中有\0
//	char arr2[] = { 'a','b','c','d','e','f', };  //arr2中没有\0
//	
//	printf("%d\n", strlen(arr1)); // 6
//	printf("%d\n", strlen(arr2)); // 随机值 
//
//	return 0;
//}


// strlen 返回值是size_t类型的,应该使用%zd打印
//int main()
//{
//	char arr1[] = "abcdef";  // arr1中有\0
//	char arr2[] = { 'a','b','c','d','e','f','\0'};  //arr2中有\0
//
//	printf("%d\n", strlen(arr1)); // 6
//	printf("%d\n", strlen(arr2)); // 6
//
//	return 0;
//}

// 转义字符  \n - 换行  

//int main()
//{
//	printf("ac\nbsd");
//	return 0;
//}

//这就是转义字符的问题， \n 是⼀个转义字符表⽰换⾏的意思，我们可以简单的理解为 \ 让 n 的意思
//发⽣了转变， n 本来是⼀个普通的字符，被 \ 转义为换⾏的意思。

//  \ ? ：在书写连续多个问号时使⽤，防⽌他们被解析成三字⺟词，在新的编译器上没法验证了。
//• \' ：⽤于表⽰字符常量'
//• \" ：⽤于表⽰⼀个字符串内部的双引号
//• \\ ：⽤于表⽰⼀个反斜杠，防⽌它被解释为⼀个转义序列符。
//• \a ：警报，这会使得终端发出警报声或出现闪烁，或者两者同时发⽣。
//• \b ：退格键，光标回退⼀个字符，但不删除字符。
//• \f ：换⻚符，光标移到下⼀⻚。在现代系统上，这已经反映不出来了，⾏为改成类似于 \v 。
//• \n ：换⾏符。
//• \r ：回⻋符，光标移到同⼀⾏的开头。
//• \t ：制表符，光标移到下⼀个⽔平制表位，通常是下⼀个8的倍数。
//• \v ：垂直分隔符，光标移到下⼀个垂直制表位，通常是下⼀⾏的同⼀列。

// \ddd ：d d d表⽰1~3个⼋进制的数字。 如： \130 表⽰字符X 
// 将\后面的8进制数字转换成十进制数字，这个数字作为ASCII值

// \xdd ：d d表⽰2个⼗六进制数字。 如： \x30 表⽰字符0
              

// \0 ：null 字符，代表没有内容， \0 就是 \ddd 这类转义字符的⼀种，⽤于字符串的结束标志，其
// ASCII码值是0.